import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.WebContext;
import org.thymeleaf.templateresolver.ServletContextTemplateResolver;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Random;


/**
 * Thymeleaf 版本，模板引擎，做到java和html分离开
 * 步骤：
 * 1、引入依赖还是从第三方库里面找
 * 2、编写html的文件（把关键信息，动态的信息 通过特殊的符号进行占位
 *    把编写好html文件放到 WEB-INF -->tamplata --> ... 这里面
 * 3、编写Servlet代码
 *    1）、初始化 Thymeleaf，这段代码可以复制粘贴
 *
 */


@WebServlet("/guessNum")
public class GuessThymeleaf extends HttpServlet {
    private int toGuess = 0;
    private Random random = new Random();

    // [1] 创建一个 TemplateEngine 对象, Template: 模板, Engine: 引擎 --> 表示动态信息 的作用
    private TemplateEngine engine = new TemplateEngine();

    // 在这个 Servlet 被加载的时候, 会被调用一次 Thyleaf 的初始化就非常适合放到这个里面.
    @Override
    public void init() throws ServletException {
        // [2] 创建一个 ServletContextTemplateResolver 对象~ resolver: 解析器. 这个对象的功能是从磁盘上加载 html 模板文件.
        ServletContextTemplateResolver resolver = new ServletContextTemplateResolver(getServletContext());
        // [3] 针对 resolver 对象来设置一些属性
        //     接下来要加载  /WEB-INF/template/ 目录中, 以 .html 结尾的文件, 作为模板引擎.
        resolver.setPrefix("/WEB-INF/template/");
        resolver.setSuffix(".html");
        resolver.setCharacterEncoding("utf-8");
        // [4] 把 resolver 和 engine 关联起来
        engine.setTemplateResolver(resolver);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 这个方法用来从服务器获取猜数字的初始页面
        resp.setContentType("text/html;charset=utf8");
        // [0,100) --> +1 -->[0,100]
        toGuess = random.nextInt(100) + 1;
        System.out.println(toGuess);

        // 这里直接通过模板加载 html文件
        // 是Thymeleaf中的对象，webContext 是 键值对结构（是一个哈希表）
        WebContext webContext= new WebContext(req,resp,getServletContext());
        // 针对猜数字的初始页面, 不需要替换内容, 直接往下写就行了.
        // process 这个操作就是在进行模板渲染!!
        engine.process("guessNum",webContext,resp.getWriter());

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 这个方法用来从服务器获取到“带有结果" 的页面
        resp.setContentType("text/html;charset=utf8");
        // 这里就要根据用户提交的数据来比较一下结果是啥了,讲字符串装换成整数
        int num = Integer.parseInt(req.getParameter("toGuess"));
        String result = "";
        if (num > toGuess) {
            result = "猜大了";
        } else if (num < toGuess) {
            result = "猜小了";
        } else {
            result = "猜对了";
        }

        // Thymeleaf中的对象，键值对结构，取得上下文模板渲染
        WebContext webContext = new WebContext(req,resp,getServletContext());
        // setVarious 就是往哈希表里面插入 键值对，这里是动态变化的信息，也是键值对的结构，插入的是什么，动态的就是什么
        webContext.setVariable("result",result);
        engine.process("guessNum",webContext,resp.getWriter());
    }
}
